﻿//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Collections;

//namespace TA.JSON
//{
//  public class MemoryObjectJson : IJsonReader
//  {
//    #region PUBLIC
//    #region INIT
//    public MemoryObjectJson(IJsonReader jr)
//    {
//      //this._curObject = this._values;
//      jr.DeserializeObject(delegate(string propName, IJsonReader j)
//      {
//        this.DeserializeObjectContent(this._values, propName, j);
//      });
//      this._objects.Push(new KeyValuePair<State, object>(State.Start, this._values));
//      this._enumerator = this._values.GetEnumerator();
//    }
//    #endregion
//    #region EVENTS
//    #endregion
//    #region PROPS
//    public JsonToken TokenType
//    {
//      get
//      {
//        if (this.CurrentObject is List<object>)
//        {
//          switch (this.CurState)
//          {
//            case State.Start: return JsonToken.StartArray;
//            case State.Value: return this.GetTokenType(this.CurrentValue);
//            case State.End: return JsonToken.EndArray;
//          }
//        }
//        else if (this.CurrentObject is Dictionary<string, object>)
//        {
//          switch (this.CurState)
//          {
//            case State.PropertyName: return JsonToken.PropertyName;
//            case State.Value: return this.GetTokenType(this.CurrentValue);
//            case State.Start: return JsonToken.StartObject;
//            case State.End: return JsonToken.EndObject;
//          }
//        }
//        return JsonToken.None;
//      }
//    }
//    public object Value
//    {
//      get { return this.CurrentValue; }
//    }
//    public JsonState CurrentState
//    {
//      get
//      {
//        if (this.CurrentObject == null)
//        {
//          return JsonState.None;
//        }
//        if (this.CurrentObject is List<object>)
//        {
//          return JsonState.Array;
//        }
//        else
//        {
//          if (this.CurState == State.Value)
//            return JsonState.ObjectValue;
//          else
//            return JsonState.Object;
//        }
//      }
//    }
//    public Dictionary<string, object> Values
//    {
//      get
//      {
//        return this._values;
//      }
//    }
//    #endregion
//    #region METHODS
//    public void Read()
//    {
//      if (this.CurrentObject == null)
//        return;
//      if (this.CurrentObject is List<object>)
//      {
//        switch (this.CurState)
//        {
//          case State.Start:
//          case State.Value:
//            if (this._enumerator.MoveNext())
//              this.CurState = State.Value;
//            else
//              this.CurState = State.End;
//            break;
//          case State.End:
//            this._objects.Pop();
//            break;
//        }
//      }
//      else
//      {
//        switch (this.CurState)
//        {
//          case State.Start:
//          case State.Value:
//            if (this._enumerator.MoveNext())
//              this.CurState = State.PropertyName;
//            else
//              this.CurState = State.End;
//            break;
//          case State.PropertyName:
//            this.CurState = State.Value;
//            break;
//          case State.End:
//            this._objects.Pop();
//            break;
//        }
//      }
//    }
//    #endregion
//    #endregion
//    #region INTERNAL
//    #region DECLARATIONS
//    enum State
//    {
//      Start,
//      PropertyName,
//      Value,
//      End,
//    }
//    #endregion
//    #region CONST/STATIC
//    #endregion
//    #region VARS
//    Dictionary<string, object> _values = new Dictionary<string, object>();
//    Stack<KeyValuePair<State, object>> _objects = new Stack<KeyValuePair<State, object>>();
//    IEnumerator _enumerator;
//    #endregion
//    #region PROPS
//    object CurrentObject
//    {
//      get
//      {
//        if (this._objects.Count == 0)
//          return null;
//        return this._objects.Peek().Value;
//      }
//    }
//    object CurrentValue
//    {
//      get
//      {
//        if (this.CurrentObject is List<object>)
//        {
//          return ((IEnumerator<object>)this._enumerator).Current;
//        }
//        else
//        {
//          KeyValuePair<string, object> kv = ((IEnumerator<KeyValuePair<string, object>>)this._enumerator).Current;
//          if (this.CurState == State.PropertyName)
//            return kv.Key;
//          else
//            return kv.Value;
//        }
//      }
//    }
//    State CurState
//    {
//      get
//      {
//        if (this._objects.Count == 0)
//          return State.End;
//        return this._objects.Peek().Key;
//      }
//      set
//      {
//        if (this._objects.Count > 0)
//        {
//          this._objects.Push(new KeyValuePair<State, object>(value, this._objects.Pop().Value));
//        }
//      }
//    }
//    #endregion
//    #region METHODS
//    #region INIT
//    #endregion
//    #region DATA
//    void DeserializeObjectContent(Dictionary<string, object> values, string propName, IJsonReader jr)
//    {
//      values[propName] = this.DeserializeValue(jr);
//    }
//    void DeserializeArrayContent(List<object> values, int index, IJsonReader jr)
//    {
//      values.Add(this.DeserializeValue(jr));
//    }
//    private object DeserializeValue(IJsonReader jr)
//    {
//      object value = null;
//      switch (jr.TokenType)
//      {
//        case JsonToken.StartArray:
//          List<object> t;
//          value = t = new List<object>();
//          jr.DeserializeArray(delegate(int index, IJsonReader j)
//          {
//            this.DeserializeArrayContent(t, index, j);
//          });
//          break;
//        case JsonToken.StartObject:
//          Dictionary<string, object> values;
//          value = values = new Dictionary<string, object>();
//          jr.DeserializeObject(delegate(string propName, IJsonReader j)
//          {
//            this.DeserializeObjectContent(values, propName, j);
//          });
//          break;
//        default:
//          value = jr.Value;
//          break;
//      }
//      return value;
//    }
//    private JsonToken GetTokenType(object value)
//    {
//      if (value is List<object>)
//        return JsonToken.StartArray;
//      if (value is Dictionary<string, object>)
//        return JsonToken.StartObject;
//      if (value is Int64)
//        return JsonToken.Integer;
//      if (value is double)
//        return JsonToken.Float;
//      if (value is string)
//        return JsonToken.String;
//      if (value is bool)
//        return JsonToken.Boolean;
//      if (value is DateTime)
//        return JsonToken.DateTime;
//      if (value == null)
//        return JsonToken.Null;

//      return JsonToken.None;
//    }
//    #endregion
//    #region HANDLERS
//    #endregion
//    #endregion
//    #endregion
//  }
//}
